package com.wsoft.core.utils;

import com.wsoft.constant.ExcelConstant;
import com.wsoft.excel.config.ExcelRangeConfig;
import com.wsoft.excel.config.ExcelStyleConfig;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Set;

/**
 * Excel导入导出工具类
 *
 * @Author z001
 * @Date 2024/11/5 08:32
 */
@Component
public class ExcelUtil {


    /**
     * 自定义参数 便捷导出
     */
    public static <T> void exportExcel(HttpServletResponse response,
                                       List<T> data,
                                       Class<T> clazz) throws IOException {
        exportExcel(response, null, null, data, clazz, null, null, null, null, null);
    }

    /**
     * 转换数据
     * @param list 待转换的list
     * @param clazz 转换后的类
     * @return
     */
    public static <T> List<T>  convertData(List<T> list, Class<T> clazz) throws Exception {
        return ExcelDataUtil.convertData(list,clazz);
    }

    //#################################  单sheet页 导出 ########################################


    /**
     * 直接导出到指定目录下
     *
     * @param filePath          文件路径 ==> 必填
     * @param sheetName         指定sheet名
     * @param data              导出的数据
     * @param clazz             导出数据的类 ==> 必填
     * @param includeColumnList 指定导出的列
     * @param headStyle         表头样式
     * @param contentStyle      内容样式
     * @param rangeConfigList   合并单元格
     * @param waterMarkContent  水印内容
     * @param <T>
     */
    public static <T> void exportExcel(String filePath,
                                       String sheetName,
                                       List<T> data,
                                       Class<T> clazz,
                                       Set<String> includeColumnList,
                                       ExcelStyleConfig headStyle,
                                       ExcelStyleConfig contentStyle,
                                       List<ExcelRangeConfig> rangeConfigList,
                                       String waterMarkContent) {
        //指定目录导出
        ExcelDataUtil.exportExcelFilePath(filePath, sheetName, data, clazz, includeColumnList, headStyle, contentStyle, rangeConfigList, waterMarkContent);
    }


    /**
     * 返回输出流
     *
     * @param sheetName         指定sheet名
     * @param data              导出的数据
     * @param clazz             导出数据的类 ==> 必填
     * @param includeColumnList 指定导出的列
     * @param headStyle         表头样式
     * @param contentStyle      内容样式
     * @param rangeConfigList   合并单元格
     * @param waterMarkContent  水印内容
     * @param <T>
     * @return
     */

    public static <T> ByteArrayOutputStream exportExcel(String sheetName,
                                                        List<T> data,
                                                        Class<T> clazz,
                                                        Set<String> includeColumnList,
                                                        ExcelStyleConfig headStyle,
                                                        ExcelStyleConfig contentStyle,
                                                        List<ExcelRangeConfig> rangeConfigList,
                                                        String waterMarkContent) {
        // 创建 ByteArrayOutputStream
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

        //返回输出流
        ExcelDataUtil.exportExcelStream(outputStream, sheetName, data, clazz, includeColumnList, headStyle, contentStyle, rangeConfigList, waterMarkContent);

        return outputStream;
    }


    /**
     * 直接 导出excel
     *
     * @param response
     * @param fileName          导出的文件名
     * @param sheetName         指定sheet名
     * @param data              导出的数据
     * @param clazz             导出数据的类 ==> 必填
     * @param includeColumnList 指定导出的列
     * @param headStyle         Excel 表头样式
     * @param contentStyle      Excel 内容样式
     * @param rangeConfigList   合并单元格
     * @param waterMarkContent  水印内容
     * @param <T>
     * @throws IOException
     */
    public static <T> void exportExcel(HttpServletResponse response,
                                       String fileName,
                                       String sheetName,
                                       List<T> data,
                                       Class<T> clazz,
                                       Set<String> includeColumnList,
                                       ExcelStyleConfig headStyle,
                                       ExcelStyleConfig contentStyle,
                                       List<ExcelRangeConfig> rangeConfigList,
                                       String waterMarkContent) throws IOException {

        //Response 直接导出
        ExcelDataUtil.exportExcelResponse(response,fileName, sheetName, data, clazz, includeColumnList, headStyle, contentStyle, rangeConfigList, waterMarkContent);
    }


    //################################# 导入 ########################################


    /**
     * 导入excel
     *
     * @param inputStream 输入流
     * @param clazz       导入数据的类
     * @param <T>
     * @return
     */
    public static <T> List<T> importExcel(InputStream inputStream, Class<T> clazz) {
        return ExcelDataUtil.importExcelBase(inputStream, clazz, ExcelConstant.DEFAULT_SHEET_NO, null);
    }

    /**
     * 导入excel
     *
     * @param inputStream 输入流
     * @param clazz       导入数据的类
     * @param sheetNo     sheetNo 从0开始
     * @param <T>
     * @return
     */
    public static <T> List<T> importExcel(InputStream inputStream, Class<T> clazz, Integer sheetNo) {
        return ExcelDataUtil.importExcelBase(inputStream, clazz, sheetNo, null);
    }

    /**
     * 导入excel
     *
     * @param inputStream 输入流
     * @param clazz       导入数据的类
     * @param sheetName   sheetName
     * @param <T>
     * @return
     */
    public static <T> List<T> importExcel(InputStream inputStream, Class<T> clazz, String sheetName) {
        return ExcelDataUtil.importExcelBase(inputStream, clazz, null, sheetName);
    }

}
